import java.util.Iterator;
public class OrderedSet<T> extends Set<T>{
	public OrderedSet(){
		
	}
	
	protected OrderedSet<T> next =null;
	//private OrderedSet<T> pre=null;
	
	@Override
	public Iterator<T> iterator(){
		return new OrderedSetIterator<T>(this);
	}
	public boolean insert(T add){
		
		if(element==add) return false;
		if(element==null){
			element=add;
			return true;
		}
		if(next==null){
			next = new OrderedSet<T>();	
		}
		
		return next.insert(add);
		/*
		if(element==null){
			element=add;
			return true;
		}
		if(this.element==add) return false;
		if(this.next==null) {
			next= new OrderedSet<T>();
			next.pre=this;
			return this.next.insert(add);
		}
		
		
		if(this.next!=null){
			if(this.shorter(add)){
				if(next.shorter(add)) return this.next.insert(add);
				else{
					OrderedSet<T> temp= new OrderedSet<T>();
					temp.element=add;
					temp.pre=this;
					temp.next=this.next;
					this.next.pre=temp;
					this.next=temp;
					return true;
				}
			}
		}
		*/
		
	}
	public boolean shorter(T temp){
		//NUR ZUM TESTEN
		int temp1=(Integer)temp;
		int temp2=(Integer)this.element;
		if( temp2==temp1) return false;
		else if (temp2<temp1) return true;
		return false;
		
	}
	
	public class OrderedSetIterator<E> implements Iterator<E>{
		
		private int count=0;
		private OrderedSet<E> start= null;
		private OrderedSet<E> LastValue=null;
		
		public OrderedSetIterator(OrderedSet<E> temp){
			start=temp;
		}
		
		public boolean hasNext(){
			OrderedSet<E> temp=start;
			/*
			for(int i=0; i< count;i++){
				if(temp.next==null) return false;
				temp=temp.next;
				
				
				
			}
			*/
			OrderedSet<E> minValue=null;
			for(int i=0;i<count;i++){
				//System.out.println("ForSchleife E NEXT");
				minValue=null;
				temp=start;
				while(temp!=null){
					if(LastValue==null){
						if(minValue==null){
							minValue=temp;
						}
						else if(temp.shorter(minValue.element)){
							minValue=temp;
						}
					}
					else{
						//System.out.println("LAST: "+LastValue.element+" AKT: "+temp.element);
						if(LastValue.shorter(temp.element)){
							
							if(minValue==null){
								minValue=temp;
							}
							if(temp.shorter(minValue.element)){
								minValue=temp;
							}
						}
					}
					if(temp.next==null)break;
					temp=temp.next;
				}
				//System.out.println("Last: "+LastValue.element+" min: "+minValue.element);
				if(minValue==null) return false;
				LastValue=minValue;
			}
			
			return true;
			
		}
		public E next(){
			OrderedSet<E> temp=start;
			/*
			for(int i=0; i< count;i++){
				temp=temp.next;
			}
			*/
			//System.out.println("E NEXT");
			if(LastValue!=null) return LastValue.element;
			OrderedSet<E> minValue=null;
			for(int i=0;i<=count;i++){
				//System.out.println("ForSchleife E NEXT");
				temp=start;
				minValue=null;
				while(temp!=null){
					if(LastValue==null){
						if(minValue==null){
							minValue=temp;
						}
						else if(temp.shorter(minValue.element)){
							minValue=temp;
						}
					}
					else{
							System.out.println("a"+LastValue.element+" "+temp.element);
							if(LastValue.shorter(temp.element)){
								
								if(minValue==null){
									System.out.println("b");
									minValue=temp;
								}
								else if(temp.shorter(minValue.element)){
									System.out.println("c");
									minValue=temp;
								}
							}
					}
					if(temp.next==null)break;
					temp=temp.next;
					
				}
				//System.out.println("Last: "+LastValue.element+" min: "+minValue.element);
				LastValue=minValue;
				//System.out.println("NewLast: "+LastValue.element);
			}
			

			count++;
			
			return LastValue.element;
		}
		public void remove(){
			
		}
		
	}
	
}
